<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: huajie <banhuajie@163.com>
// +----------------------------------------------------------------------

namespace Api\Model;
use Think\Model;

/**
 * 用户组模型类
 * Class AuthGroupModel
 * @author 朱亚杰 <zhuyajie@topthink.net>
 */
class AuthGroupModel extends Model {
	const TYPE_ADMIN = 1; // 管理员用户组类型标识
	const TYPE_HOME = 2; //前台访问用户组类型标识
	const MEMBER = 'member';
	const UCENTER_MEMBER = 'ucenter_member';
	const AUTH_GROUP_ACCESS = 'auth_group_access'; // 关系表表名
	const AUTH_EXTEND = 'auth_extend'; // 动态权限扩展信息表
	const AUTH_GROUP = 'auth_group'; // 用户组表名
	const AUTH_EXTEND_CATEGORY_TYPE = 1; // 分类权限标识
	const AUTH_EXTEND_MODEL_TYPE = 2; //分类权限标识

	protected $_validate = array(
		array('title', 'require', '必须设置用户组标题', Model::MUST_VALIDATE, 'regex', Model::MODEL_INSERT),
		//array('title','require', '必须设置用户组标题', Model::EXISTS_VALIDATE  ,'regex',Model::MODEL_INSERT),
		array('description', '0,80', '描述最多80字符', Model::VALUE_VALIDATE, 'length', Model::MODEL_BOTH),
		// array('rules','/^(\d,?)+(?<!,)$/', '规则数据不合法', Model::VALUE_VALIDATE , 'regex'  ,Model::MODEL_BOTH ),
	);

	/**
	 * 返回用户组列表
	 * 默认返回正常状态的管理员用户组列表
	 * @param array $where   查询条件,供where()方法使用
	 *
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	public function getGroups($where = array()) {
		$map = array('status' => 1, 'type' => self::TYPE_ADMIN, 'module' => 'admin');
		$map = array_merge($map, $where);
		return $this->where($map)->select();
	}

	/**
	 * 把用户添加到用户组,支持批量添加用户到用户组
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 *
	 * 示例: 把uid=1的用户添加到group_id为1,2的组 `AuthGroupModel->addToGroup(1,'1,2');`
	 */
	public function addToGroup($uid, $gid) {
		$uid = is_array($uid) ? implode(',', $uid) : trim($uid, ',');
		$gid = is_array($gid) ? $gid : explode(',', trim($gid, ','));

		$Access = M(self::AUTH_GROUP_ACCESS);
		if (isset($_REQUEST['batch'])) {
			//为单个用户批量添加用户组时,先删除旧数据
			$del = $Access->where(array('uid' => array('in', $uid)))->delete();
		}

		$uid_arr = explode(',', $uid);
		$uid_arr = array_diff($uid_arr, array(C('USER_ADMINISTRATOR')));
		$add = array();
		if ($del !== false) {
			foreach ($uid_arr as $u) {
				foreach ($gid as $g) {
					if (is_numeric($u) && is_numeric($g)) {
						$add[] = array('group_id' => $g, 'uid' => $u);
					}
				}
			}
			$Access->addAll($add);
		}
		if ($Access->getDbError()) {
			if (count($uid_arr) == 1 && count($gid) == 1) {
				//单个添加时定制错误提示
				$this->error = "不能重复添加";
			}
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 返回用户所属用户组信息
	 * @param  int    $uid 用户id
	 * @return array  用户所属的用户组 array(
	 *                                         array('uid'=>'用户id','group_id'=>'用户组id','title'=>'用户组名称','rules'=>'用户组拥有的规则id,多个,号隔开'),
	 *                                         ...)
	 */
	static public function getUserGroup($uid) {
		static $groups = array();
		if (isset($groups[$uid])) {
			return $groups[$uid];
		}

		$prefix = C('DB_PREFIX');
		$user_groups = M()
			->field('uid,group_id,title,description,rules')
			->table($prefix . self::AUTH_GROUP_ACCESS . ' a')
			->join($prefix . self::AUTH_GROUP . " g on a.group_id=g.id")
			->where("a.uid='$uid' and g.status='1'")
			->select();
		$groups[$uid] = $user_groups ? $user_groups : array();
		return $groups[$uid];
	}

	/**
	 * 返回用户拥有管理权限的扩展数据id列表
	 *
	 * @param int     $uid  用户id
	 * @param int     $type 扩展数据标识
	 * @param int     $session  结果缓存标识
	 * @return array
	 *
	 *  array(2,4,8,13)
	 *
	 * @author 朱亚杰 <xcoolcc@gmail.com>
	 */
	static public function getAuthExtend($uid, $type, $session) {
		if (!$type) {
			return false;
		}
		if ($session) {
			$result = session($session);
		}
		if ($uid == UID && !empty($result)) {
			return $result;
		}
		$prefix = C('DB_PREFIX');
		$result = M()
			->table($prefix . self::AUTH_GROUP_ACCESS . ' g')
			->join($prefix . self::AUTH_EXTEND . ' c on g.group_id=c.group_id')
			->where("g.uid='$uid' and c.type='$type' and !isnull(extend_id)")
			->getfield('extend_id', true);
		if ($uid == UID && $session) {
			session($session, $result);
		}
		return $result;
	}

	/**
	 * 返回用户拥有管理权限的分类id列表
	 *
	 * @param int     $uid  用户id
	 * @return array
	 *
	 *  array(2,4,8,13)
	 *
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	static public function getAuthCategories($uid) {
		return self::getAuthExtend($uid, self::AUTH_EXTEND_CATEGORY_TYPE, 'AUTH_CATEGORY');
	}

	/**
	 * 获取用户组授权的扩展信息数据
	 *
	 * @param int     $gid  用户组id
	 * @return array
	 *
	 *  array(2,4,8,13)
	 *
	 * @author 朱亚杰 <xcoolcc@gmail.com>
	 */
	static public function getExtendOfGroup($gid, $type) {
		if (!is_numeric($type)) {
			return false;
		}
		return M(self::AUTH_EXTEND)->where(array('group_id' => $gid, 'type' => $type))->getfield('extend_id', true);
	}

	/**
	 * 获取用户组授权的分类id列表
	 *
	 * @param int     $gid  用户组id
	 * @return array
	 *
	 *  array(2,4,8,13)
	 *
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	static public function getCategoryOfGroup($gid) {
		return self::getExtendOfGroup($gid, self::AUTH_EXTEND_CATEGORY_TYPE);
	}

	/**
	 * 批量设置用户组可管理的扩展权限数据
	 *
	 * @param int|string|array $gid   用户组id
	 * @param int|string|array $cid   分类id
	 *
	 * @author 朱亚杰 <xcoolcc@gmail.com>
	 */
	static public function addToExtend($gid, $cid, $type) {
		$gid = is_array($gid) ? implode(',', $gid) : trim($gid, ',');
		$cid = is_array($cid) ? $cid : explode(',', trim($cid, ','));

		$Access = M(self::AUTH_EXTEND);
		$del = $Access->where(array('group_id' => array('in', $gid), 'type' => $type))->delete();

		$gid = explode(',', $gid);
		$add = array();
		if ($del !== false) {
			foreach ($gid as $g) {
				foreach ($cid as $c) {
					if (is_numeric($g) && is_numeric($c)) {
						$add[] = array('group_id' => $g, 'extend_id' => $c, 'type' => $type);
					}
				}
			}
			$Access->addAll($add);
		}
		if ($Access->getDbError()) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 批量设置用户组可管理的分类
	 *
	 * @param int|string|array $gid   用户组id
	 * @param int|string|array $cid   分类id
	 *
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	static public function addToCategory($gid, $cid) {
		return self::addToExtend($gid, $cid, self::AUTH_EXTEND_CATEGORY_TYPE);
	}

	/**
	 * 将用户从用户组中移除
	 * @param int|string|array $gid   用户组id
	 * @param int|string|array $cid   分类id
	 * @author 朱亚杰 <xcoolcc@gmail.com>
	 */
	public function removeFromGroup($uid, $gid) {
		return M(self::AUTH_GROUP_ACCESS)->where(array('uid' => $uid, 'group_id' => $gid))->delete();
	}

	/**
	 * 获取某个用户组的用户列表
	 *
	 * @param int $group_id   用户组id
	 *
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	static public function memberInGroup($group_id) {
		$prefix = C('DB_PREFIX');
		$l_table = $prefix . self::MEMBER;
		$r_table = $prefix . self::AUTH_GROUP_ACCESS;
		$r_table2 = $prefix . self::UCENTER_MEMBER;
		$list = M()->field('m.uid,u.username,m.last_login_time,m.last_login_ip,m.status')
			->table($l_table . ' m')
			->join($r_table . ' a ON m.uid=a.uid')
			->join($r_table2 . ' u ON m.uid=u.id')
			->where(array('a.group_id' => $group_id))
			->select();
		return $list;
	}

	/**
	 * 检查id是否全部存在
	 * @param array|string $gid  用户组id列表
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	public function checkId($modelname, $mid, $msg = '以下id不存在:') {
		if (is_array($mid)) {
			$count = count($mid);
			$ids = implode(',', $mid);
		} else {
			$mid = explode(',', $mid);
			$count = count($mid);
			$ids = $mid;
		}

		$s = M($modelname)->where(array('id' => array('IN', $ids)))->getField('id', true);
		if (count($s) === $count) {
			return true;
		} else {
			$diff = implode(',', array_diff($mid, $s));
			$this->error = $msg . $diff;
			return false;
		}
	}

	/**
	 * 检查用户组是否全部存在
	 * @param array|string $gid  用户组id列表
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	public function checkGroupId($gid) {
		return $this->checkId('AuthGroup', $gid, '以下用户组id不存在:');
	}

	/**
	 * 检查分类是否全部存在
	 * @param array|string $cid  栏目分类id列表
	 * @author 朱亚杰 <zhuyajie@topthink.net>
	 */
	public function checkCategoryId($cid) {
		return $this->checkId('Category', $cid, '以下分类id不存在:');
	}

}
